#include <Arduino.h>
#include "blinker_apply.h"
#include "motor_drive.h"

// 新建组件对象
BlinkerButton Button1(ButtonABC);   // 开关灯
BlinkerNumber Number1(NumberABC);   // 计数

BlinkerSlider   Slider_PWM(Slider_PWM_Name);      // 滑动条 - 调节PWM
BlinkerButton   Button_Up(Button_Up_Name);        // 向前
BlinkerJoystick Joystick_Dir(Joystick_Dir_Name);  // 摇杆 - 控制运动方向

Car car;

void setup() {
    // 初始化串口
    Serial.begin(115200);

    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif

    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);

    // 初始化blinker
    #if defined(BLINKER_BLE)
        Blinker.begin();
    #elif defined(BLINKER_WIFI) || defined(BLINKER_MQTT)
        Blinker.begin(DEVICE_KEY, WIFI_NAME, WIFI_PASSWORD);
    #else
        Serial.println("ERR: 没有定义任何网络库");
    #endif

    // 未绑定的组件报文打印
    Blinker.attachData([](const String & data) {
        // TODO: 用摇杆控制频繁时，收到不完整的报文会导致摇杆控件收不到正确的复位命令
        BLINKER_LOG("Blinker readString: ", data);
    });

    // 初始化电机
    car.initMotor();

    Button1.attach([](const String & state) {
        // car.getMotorSpeed();
    });

    Slider_PWM.attach([](const int32_t value) {
        // car.setMotorSpeed((uint8_t)value);
    });

    Button_Up.attach([](const String & state) {
        BLINKER_LOG("get Button_Up state: ", state);
        if (state == "press") {
            car.pinOutput(emChannel_0, HIGH);
        }
        else {
            car.pinOutput(emChannel_0, LOW);
        }
    });

    // 摇杆 - 控制运动方向
    Joystick_Dir.attach([](uint8_t xAxis, uint8_t yAxis) {
        car.moveCar(xAxis, yAxis);
    });

}

void loop() {
    Blinker.run();
}